package com.skyd.core.draw;

import java.io.InputStream;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Path;
import android.graphics.RectF;
import android.graphics.Region;

import com.skyd.core.vector.Vector2D;
import com.skyd.core.vector.Vector2DF;

public final class DrawHelper {
	
	/**
	 * 计算缩放后的尺寸
	 * @param width 原始宽度
	 * @param height 原始高度
	 * @param targetWidth 目标宽度
	 * @param targetHeight 目标高度
	 * @param isRestrictMode 是否使用约束模式，即计算后的宽度和高度都不会超出目标尺寸。如果为false则会将值最小的一轴与目标轴的值匹配，另一轴则会超出目标值，通常用于缩放并剪裁为固定尺寸的图时使用
	 * @return 计算后的尺寸，X轴表示宽度，Y轴表示高度
	 */
	public static Vector2D calculateScaleSize(double width,double height,double targetWidth,double targetHeight,boolean isRestrictMode){
		if(isRestrictMode){
			if(targetWidth/width<targetHeight/height){
				return new Vector2D(targetWidth, targetWidth/width*height);
			}
			else{
				return new Vector2D(targetHeight/height*width, targetHeight);
			}
		}
		else{
			if(targetWidth/width>targetHeight/height){
				return new Vector2D(targetWidth, targetWidth/width*height);
			}
			else{
				return new Vector2D(targetHeight/height*width, targetHeight);
			}
		}
	}
	
	/**
	 * 计算缩放后的尺寸
	 * @param width 原始宽度
	 * @param height 原始高度
	 * @param targetWidth 目标宽度
	 * @param targetHeight 目标高度
	 * @param isRestrictMode 是否使用约束模式，即计算后的宽度和高度都不会超出目标尺寸。如果为false则会将值最小的一轴与目标轴的值匹配，另一轴则会超出目标值，通常用于缩放并剪裁为固定尺寸的图时使用
	 * @return 计算后的尺寸，X轴表示宽度，Y轴表示高度
	 */
	public static Vector2DF calculateScaleSize(float width,float height,float targetWidth,float targetHeight,boolean isRestrictMode){
		if(isRestrictMode){
			if(targetWidth/width<targetHeight/height){
				return new Vector2DF(targetWidth, targetWidth/width*height);
			}
			else{
				return new Vector2DF(targetHeight/height*width, targetHeight);
			}
		}
		else{
			if(targetWidth/width>targetHeight/height){
				return new Vector2DF(targetWidth, targetWidth/width*height);
			}
			else{
				return new Vector2DF(targetHeight/height*width, targetHeight);
			}
		}
	}
	
	/**
	 * 读取资源中的图像
	 * @param context 上下文
	 * @param resId 资源ID
	 * @param cfg 选项
	 * @return 图像
	 */
	public static Bitmap loadBitmap(Context context, int resId,Bitmap.Config cfg){  
	    BitmapFactory.Options opt = new BitmapFactory.Options();  
	    opt.inPreferredConfig = cfg;   
	    opt.inPurgeable = true;  
	    opt.inInputShareable = true;  
	       //获取资源图片  
	    InputStream is = context.getResources().openRawResource(resId);  
	        return BitmapFactory.decodeStream(is,null,opt);  
	}  
	
	/**
	 * 以默认的ARGB_8888格式读取资源中的图像
	 * @param context 上下文
	 * @param resId 资源ID
	 * @param cfg 选项
	 * @return 图像
	 */
	public static Bitmap loadBitmap(Context context, int resId){
		return loadBitmap(context, resId, Bitmap.Config.ARGB_8888);
	}
	
	/**
	 * 由路径获取Region对象，Region对象可以通过其contains方法判断一个坐标是否位于该对象区域内。
	 * @param p 路径
	 * @return Region对象
	 */
	public static Region getRegionFromPath(Path p){
		Region re=new Region();
		RectF r=new RectF();
		p.computeBounds(r, true);
		re.setPath(p, new Region((int)r.left,(int)r.top,(int)r.right,(int)r.bottom));
		return re;
	}
}
